package main

import "fmt"

var a1 = "Hello"
var b1 string = "World"
var c1 bool

//d := 30

func main() {

	println(a1, b1, c1)

	//虽然变量全部用var 定义，但go绝对是一个强类型的变成语言，类型是根据后面的值推测的
	var str string
	str = "tuanzhang"

	var a int = 10
	var b = 20
	//如果没有赋值，必须写明类型，因为强类型必须要有类型
	var c int
	//省略var, 注意 :=左侧的变量不应该是已经声明过的
	//这种方式它只能被用在函数体内，而不可以用于全局变量的声明与赋值
	d := 30

	println(str)
	println(a)
	println(b)
	println(c)
	println(d)

	//多变量声明
	var name1, name2, name3 int
	name1, name2, name3 = 1, 2, 3
	fmt.Printf("同时定义多个变量 %d, %d, %d \n", name1, name2, name3)

	name4, name5, name6 := 1, "测试", true
	fmt.Printf("同时定义多个变量直接复制多个类型 %d, %s, %t \n", name4, name5, name6)

	var name7, name8, name9 = 1, "测试", true
	fmt.Printf("同时定义多个变量直接复制多个类型 %d, %s, %t \n", name7, name8, name9)

	//使用cost 定义常亮
	const TYPE = "1"

	const type1, type2, type3 = 1, false, "str" //多重赋值
	fmt.Println(type1, type2, type3)

	fmt.Println("常量组中如不指定类型和初始化值，则与上一行非空常量右值相同", STATUS1, STATUS2, STATUS3, STATUS4)

	fmt.Println("IOTA的用法", IOTA1, IOTA2, IOTA3)
	fmt.Println("IOTA的用法", IOTA4, IOTA5, IOTA6, IOTA7, IOTA8, IOTA9)

}

// 枚举，常亮组
const (
	STATUS1 = 1
	STATUS2 = 2
	STATUS3 = 3
	//常量组中如不指定类型和初始化值，则与上一行非空常量右值相同
	STATUS4
)

// iota，特殊常量，可以认为是一个可以被编译器修改的常量
const (
	IOTA1 = iota
	IOTA2 = iota
	IOTA3
)

const (
	IOTA4 = iota
	IOTA5 = 999
	IOTA6 = iota
	IOTA7 = 1000
	IOTA8
	IOTA9 = iota
)
